/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import model.dto.MatrizDTO;

/**
 *
 * @author Gabriel
 */
public class MatrizDAO extends DAO {

    private static final String SELECT_MATRIZ =
                                    ""; //TODO: Incorporar select de negocio


    /**
    * Construtor que inicializa o Connector (interface com o Banco)
    */
    public MatrizDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    /**
     * Método que obtem a matriz corrente de um Result Set
     * @param rs Result Set
     * @return Matriz correspondente
     * @throws SQLException
     */
    private MatrizDTO getMatrizCorrenteResultSet(ResultSet rs) throws SQLException {

        MatrizDTO matrizDTO = new MatrizDTO();
        matrizDTO.setId(rs.getInt("Id"));
        matrizDTO.setFlgArvoreConjunto(rs.getString("Flg_Arvore_Conjunto"));
        matrizDTO.setEspecie(rs.getInt("Id_Especie"), rs.getString("Nome_Cientifico"), rs.getString("Nome_Vulgar"));
        matrizDTO.setLocal(rs.getInt("Id_Local"), rs.getString("Endereco"), rs.getString("Bairro"), rs.getString("Cidade"), rs.getString("Estado"));
        //TODO : Setar as fotos!!!

        return matrizDTO;
    }

    /**
     * Retorna lista de Matrizes de um Result Set
     * @param rs Result Set
     * @return Lista de Matrizes
     * @throws SQLException
     */
    public LinkedList<MatrizDTO> getMatrizesResultSet(ResultSet rs) throws SQLException {

        LinkedList<MatrizDTO> matrizesDTO = new LinkedList<MatrizDTO>();

        while (resultSet.next()) {
            matrizesDTO.add(getMatrizCorrenteResultSet(resultSet));
        }

        return matrizesDTO;
    }

    /**
     * Pesquisa uma matriz pelos parâmetros indicados. Pode ser indicado um ou mais parâmetros.
     * @param Id Id da Matriz
     * @param nomeEspecie Nome da Espécie (Científico ou vulgar)
     * @param endereco Endereço da Matriz
     * @param cidade Cidade da Matriz
     * @param estado Estado da Matriz
     * @param bairro Bairro da Matriz
     * @return Retorna lista com resultados encontrados
     * @throws SQLException
     */
    public LinkedList<MatrizDTO> pesquisaMatriz(Integer Id,
                                                String nomeEspecie,
                                                String endereco,
                                                String cidade,
                                                String estado,
                                                String bairro) throws SQLException {
        sql = SELECT_MATRIZ;

        if (Id != null) {
            sql += "  AND m.Id = " + Id + "\n";
        }

        if (nomeEspecie != null) {
            sql += " AND (e.nome_cientifico like '%" + nomeEspecie + "%' OR e.nome_vulgar like '%" + nomeEspecie + "%')\n";
        }

        if (endereco != null) {
            sql += "  AND d.endereco like '%" + endereco + "%'\n";
        }

        if (cidade != null) {
            sql += "  AND d.cidade like '%" + cidade + "%'\n";
        }

        if (estado != null) {
            sql += "  AND d.estado like '%" + estado + "%'\n";
        }

        if (bairro != null) {
            sql += "  AND d.bairro like '%" + bairro + "%'\n";
        }

        sql += ";";

        resultSet = connector.executeSelectQuery(sql);

        return getMatrizesResultSet(resultSet);
    }

    /**
     * Insere uma nova matriz na base de dados
     * @param matrizDTO Dados da nova matriz a serem persistidos na base
     * @throws SQLException 
     */
    public void insereMatriz(MatrizDTO matrizDTO) throws SQLException {
        sql = "INSERT INTO MATRIZ(Id_Local, Id_Especie, Flg_Arvore_Conjunto) " +
              "VALUES (" + matrizDTO.getIdLocal() + "," + matrizDTO.getIdEspecie() + "," + matrizDTO.getFlgArvoreConjunto() + ")";
        
        connector.executeInsertQuery(sql);       
    }

    public void atualizaMatriz(MatrizDTO matrizDTO,
                               boolean atualizaEspecie,
                               boolean atualizaLocal,
                               boolean atualizaFlgArvoreConjunto) throws SQLException {
        
        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;
        
        sql = "UPDATE MATRIZ\n" +
              "SET ";
        
        if (atualizaEspecie) {
            sql += "Id_Especie = " + matrizDTO.getIdEspecie() + "\n";
            naoPossuiAtualizacaoAinda = false;
        }
        
        if (atualizaLocal) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Id_Local = " + matrizDTO.getIdLocal() + "\n";
                naoPossuiAtualizacaoAinda = false;   
            } else {
                sql += ",Id_Local = " + matrizDTO.getIdLocal() + "\n";
            }
        }
        
        if (atualizaFlgArvoreConjunto) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Flg_Arvore_Conjunto = " + matrizDTO.getFlgArvoreConjunto() + "\n";
                naoPossuiAtualizacaoAinda = false;   
            } else {
                sql += ",Flg_Arvore_Conjunto = " + matrizDTO.getFlgArvoreConjunto() + "\n";
            }
        }
                
        sql += "WHERE Id = " + matrizDTO.getId() + ";";
        
        connector.executeUpdateQuery(sql);
    }

}
